<?php
class Index_controller extends Controller
{	                   
    public static $main_uid = 1;
    
    // Войти под кем то (для админов)
    public function loginID()
    {
    	if ($this->user->status == 3)
    	{
			$_SESSION["user_id"] = $this->req["id"];
    	}		
    }
    
    // Регистрация
    public function reg()
    {    	
    	try
    	{
            if (($this->req["login"] != "") && ($this->req["password"] != ""))
            {
			    $user = new wj_users(true);
			    $user->name = $this->req["login"];
			    $user->pass = md5($this->req["password"]);
			    $user->dt_reg = time();
			    $user->dt_login = time();
                $user->dir = 0;
			    $user->save();
			    $root = new wj_folders(true);
			    $root->name = $user->name;
			    $root->descr = $user->name;
			    $root->user_id = $user->id;
			    $root->parent_id = 0;
			    $root->color = "green";
			    $root->type = 1;
			    $root->x = 1;
			    $root->y = 1;
			    $root->save();
			    $user->root_dir = $root->id;
			    $user->dir = $root->id;
			    $user->save();
			    
			    $_SESSION["user_id"] = $user->id;
                $_SESSION["user_view"] = null;			
			    $this->message("Регистрация завершена!", "Регистрация", 2);
                $user->readonly = 0;
			    $this->sendUserData($user);		
            }
            else
            {
                $this->message("Введите Логин и Пароль для регистрации.", "Регистрация", 1);
            }
		}
		catch(Exception $e)
		{
			$this->message($e->getMessage(), "Регистрация", 1);
		}
    }
    
    // Авторизация 
    public function login()
    {
    	if ($_SESSION["user_id"] > 0)
    	{
            $_SESSION["user_view"] = null;
			$query = new Query();
    		$query->field("id", $_SESSION["user_id"]);
    		$user = Worker::fetchObjectByFields(wj_users, $query);
    	}
    	else
    	{         
            if ($this->req["login"] == null)
    		{
                $user = Worker::fetchObject(wj_users, array("id" => self::$main_uid));
                $_SESSION["user_view"] = $user->id;
            }
            else
            {
                $_SESSION["user_view"] = null;
                $query = new Query();
    		    $query->field("name", $this->req["login"]);
    		    $user = Worker::fetchObjectByFields(wj_users, $query);
            }
		}
    	if (($_SESSION["user_id"] > 0 || $user instanceof wj_users) && $_SESSION["user_view"] == null)
    	{
    		if ($_SESSION["user_id"] > 0 || $user->pass == md5($this->req["password"]))
    		{
				$_SESSION["user_id"] = $user->id;				
                $user->readonly = 0;
				$this->sendUserData($user);			
                $this->message("Добро пожаловать ".$user->name, "Вход", 2);
    		}
    		else
    		{
    			$this->message("Неверный пароль!", "Вход", 1);
    		}			
    	}
    	else
    	{
            if (($_SESSION["user_view"] != null) && $user instanceof wj_users)
            {
                $user->readonly = 1;
                $this->sendUserData($user);            
                $this->message("Добро пожаловать гость", "Вход", 2);
            }
            else
            {
    		    $this->message("Учётной записи с таким именем не существует!", "Вход", 1);
            }
    	}		
    }
    
    // Отправить данные о пользователе
    public function sendUserData($user)
    {
		$user->loadRelated("folders", true);		
		$data = $user->toArray(true, null, true);						
		if (count($user->folders) == 0)
        {
			$data["folders"] = array();
        }
        else
        {            
            foreach($user->folders as $folder)
            {
                $data["folders"][$folder->id] = $folder->toArray(true);
                $data["folders"][$folder->id]["access"] = json_decode($folder->access);
                $data["folders"][$folder->id]["access_for"] = json_decode($folder->access_for);
            }
        }
        $root = Worker::fetchObject(wj_folders, array("id" => $this->user->dir));
        if ($root instanceof wj_folders)
        {
            $data["folders"][$root->id] = $root->toArray(true);
            $data["folders"][$root->id]["access"] = json_decode($root->access);
            $data["folders"][$root->id]["access_for"] = json_decode($root->access_for);
        }
        $data["readonly"] = $user->readonly;
		$this->ajax[] = Array("a"=>"login", "d" => $data);
    }
    
    // Выход
    public function logout()
    {
    	$_SESSION["user_id"] = 0;
		unset($_SESSION["user_id"]);
		core::$user = null;
		$this->ajax[] = Array("a"=>"logout", "d" => "1");			
        $this->login();
    }
    
    // Создать новую ячейку
    public function newField()
    {
        // Если пользователь только для чтения то не может ничего делать
        if ($this->user->readonly == 1)
        {
            $this->message('Зарегистрируйтесь или войдите.', "Запрещено", 1);
            return false;
        }
        
        // Если переносим ячейку        
        if ($this->req["id"])
        {
            // Получаем ячейку
            $query = new Query();
            $query->field("user_id", $this->user->id);
            $query->field("id", $this->req["id"]);
            $field = worker::fetchObjectByFields(wj_folders, $query);
            if ($field instanceof wj_folders)
            {
                if ($this->req["x"] > 6 || $this->req["y"] < 1 || $this->req["y"] > 5)
                {
                    $this->message('Некорректные координаты ячейки', "Перемещение ячейки", 1);
                }
                else
                {                        
                    // Переместить на корень выше
                    if ($this->req["x"] < 1)
                    {
                        $nfield = worker::fetchObject(wj_folders, array("id" => $this->user->dir));
                        if ($nfield instanceof wj_folders && $nfield->user_id == $this->user->id)
                        {                            
                            $field->parent_id = $nfield->parent_id;  
                            $field->x = 1;
                            $field->y = 1;   
                            if ($nfield->parent_id == 0)
                                $this->message('Ячейка перенесена на директорию выше, в корневую директорию', "Перемещение ячейки", 2); 
                            else
                                $this->message('Ячейка перенесена на директорию выше, в ячейку '.$nfield->name, "Перемещение ячейки", 2); 
                        }
                        else
                        {
                            $this->message('Верхняя директория не найдена', "Перемещение ячейки", 1);
                        }
                        
                    }
                    else
                    {
                        // Проверяем нет ли ячейку на месте новой позиции
                        $query = new Query();
                        $query->field("user_id", $this->user->id);
                        $query->field("parent_id", $this->user->dir);
                        $query->field("x", $this->req["x"]);
                        $query->field("y", $this->req["y"]);
                        $nfield = worker::fetchObjectByFields(wj_folders, $query);
                        if (($nfield instanceof wj_folders) && ($nfield->id != $field->id))
                        {
                            if ($nfield->type == 1)
                            {
                                $field->parent_id = $nfield->id;
                                $field->x = 1;
                                $field->y = 1;      
                                $this->message('Ячейка перенесена в '.$nfield->name, "Перемещение ячейки", 2);                                                                
                            }
                            else
                            {
                                $this->message('Ячейка '.$nfield->name.' не является папкой, поэтому в неё нельзя переместить ячейку '.$field->name, "Перемещение ячейки", 1);                                                                
                            }
                        }
                        else
                        {
                            $field->x = $this->req["x"];
                            $field->y = $this->req["y"];                    
                        }
                    }
                    $field->save();
                    $this->ajax[] = Array("a"=>"deleteField", "d" => $field->id);
                    $this->ajax[] = Array("a"=>"newField", "d" => $field->toArray(true));
                }
            }
            else
            {
                $this->message('Ячейка не найдена', "Перемещение ячейки", 1);
            }
        }
        // Если создаём ячейку
        else
        {
    	    // Проверяем свободно ли эта ячейка
    	    $query = new Query();
    	    $query->field("user_id", $this->user->id);
    	    $query->field("parent_id", $this->user->dir);
    	    $query->field("x", $this->req["x"]);
    	    $query->field("y", $this->req["y"]);
    	    $field = Worker::fetchObjectByFields(wj_folders, $query);
    	    if ($field instanceof wj_folders)
    	    {
    		    $this->message('Ячейка уже занята', "Новая ячейка", 1);
    	    }
    	    else
    	    {
    		    if ($this->req["x"] < 1 || $this->req["x"] > 6 || $this->req["y"] < 1 || $this->req["y"] > 5)
    		    {
    			    $this->message('Некорректные координаты ячейки', "Новая ячейка", 1);
    		    }
    		    else
    		    {    		    	
                   	$ufield = Worker::fetchObject(wj_folders, array("user_id" => $this->user->id, "id" => $this->user->dir));
                    if ($ufield instanceof wj_folders)
                    {
    			        // Создаём ячейку
				        $field = new wj_folders(true);
				        $field->user_id = $this->user->id;
				        $field->x = $this->req["x"];
				        $field->y = $this->req["y"];
				        $field->type = $this->req["type"];
				        $field->color = $this->req["color"];
				        $field->parent_id = $this->user->dir;
				        $field->name = "Новая ячейка";
				        $field->save();			
                        $this->message("Создана ячейка", null, 2);
				        $this->ajax[] = Array("a"=>"newField", "d" => $field->toArray(true));			
                    }
                    else
                    {
                        $this->message("Вы создаёте ячейку не в своей папке, доступ только для чтения", null, 1);
                    }
			    }
		    }
        }
    }
    
    // Удалять ячейку
    public function deleteField()
    {        
        // Если пользователь только для чтения то не может ничего делать
        if ($this->user->readonly == 1)
        {
            $this->message('Зарегистрируйтесь или войдите.', "Запрещено", 1);
            return false;
        }
        
    	$query = new Query();
    	$query->field("user_id", $this->user->id);
    	$query->field("id", $this->req["id"]);
    	$field = Worker::fetchObjectByFields(wj_folders, $query);
    	if ($field instanceof wj_folders)
    	{    	
            $this->recursDeleteField($field);
			$this->ajax[] = Array("a"=>"deleteField", "d" => $field->id);						
            $this->message($field->name, "Удалено", 2);
    	}
    	else
    	{
    		$this->message('Ячейка не найдена', "Удаление ячейки", 1);	
    	}
	}
    
    // Рекурсивное удаление всех вложений
    public function recursDeleteField($field)
    {
        $query = new Query();
        $query->field("parent_id", $field->id);
        $fields = Worker::fetchManyObject(wj_folders, $query);
        if ($fields)
        {
            foreach($fields as $fld)
            {
                $this->recursDeleteField($fld);
            }
        }
        $field->delete();
    }
    
    // Перейти в ячейку
    public function goInField()
    {
        if ($this->req["id"])
        {
            $field = Worker::fetchObject(wj_folders, array("id" => $this->req["id"]));
            if ($field instanceof wj_folders)
            {
                
                if ($field->type == 1)
                {
                    // Запрашиваем все ячейки в папке                    
                    $query = new Query();
                    $query->field("parent_id", $field->id);
                    $fields = Worker::fetchManyObject(wj_folders, $query);
                    if ($fields)
                    {
                        foreach($fields as $pfield)
                        {
                            $this->ajax[] = Array("a"=>"newField", "d" => $pfield->toArray(true));
                        }                        
                    }
                    $this->ajax[] = Array("a"=>"newField", "d" => $field->toArray(true));
                    $this->user->dir = $field->id;
                    $this->user->save();                
                    $this->ajax[] = Array("a"=>"changeUserDir", "d" => $this->user->dir);
                    $this->message($field->name, "Перешли в", 2);
                }
                else
                {
                    $this->ajax[] = Array("a"=>"newField", "d" => $field->toArray(true));                    
                    $this->ajax[] = Array("a"=>"openContent", "d" => $field->id);                
                    $this->message($field->name, "Открыли", 2);
                }
                
                
            }
        }
    }
    
    // Перейти на уровень выше
    public function backDir()
    {               
        if ($this->req["id"])
        {
        	if ($this->req["id"] == -1)
        		$this->req["id"] = $this->user->root_dir;        	
            $this->goInField();
        }
        else
        {             
	        $field = Worker::fetchObject(wj_folders, array("id" => $this->user->dir));
	            
	        if (!$field instanceof wj_folders)
	        {                    
        		$field = Worker::fetchObject(wj_folders, array("id" => $this->user->root_dir));
			}
			
		    // Нашли текущую ячейку
		    if ($field instanceof wj_folders)
			{
				// Родитель текущей не корневая диретория
			    if ($field->parent_id != 0)
			    {
		    		// Находим родительскую директорию от текущей
		    		$nfield = Worker::fetchObject(wj_folders, array("id" => $field->parent_id));		    	
		    		if ($nfield instanceof wj_folders)
		    		{
	    				// Устанавливаем пользователю новую директорию
	    				$dir = $nfield->id;		    		  
	    				  
	    				// Запрашиваем все ячейки в папке                    		    
					    $query = new Query();
					    $query->field("parent_id", $nfield->id);
					    $fields = Worker::fetchManyObject(wj_folders, $query);
					    if ($fields)
					    {
					        foreach($fields as $pfield)
					        {
					            $this->ajax[] = Array("a"=>"newField", "d" => $pfield->toArray(true));
					        }                        
					    }
					    $this->message($nfield->name, "Перешли в ", 2);
					}
				    
				}
				else
				{
					$this->message("Вы находитесь в корне, перейти выше нельзя.", null, 1);
				}
			}
			else
			{
				$this->message("Верхняя директория не найдена", null, 1);
			}
			        
	                
	        if ($dir)
	        {
        		$this->user->dir = $dir;
		        $this->user->save();
		        $this->ajax[] = Array("a"=>"changeUserDir", "d" => $dir);               
			}
		}
        
    }
    
    
    // Сохранить изменения ячейки
    public function saveField()
    {
        // Если пользователь только для чтения то не может ничего делать
        if ($this->user->readonly == 1)
        {
            $this->message('Зарегистрируйтесь или войдите.', "Запрещено", 1);
            return false;
        }
        
        try
        {
            $field = Worker::fetchObject(wj_folders, array("id" => $this->req["id"], "user_id" => $this->user->id));
            if ($field instanceof wj_folders && $field->user_id == $this->user->id && !$this->user->readonly)
            {
                $data = $this->req["field"];
                foreach($data as $par => $value)
                {
                    $field->{$par} = $value;
                }
                $field->save();
                $this->ajax[] = Array("a"=>"newField", "d" => $field->toArray(true));
                $this->message("Ячейка сохранена", "Редактирование", 2);
            }
            else
            {
                $this->message("Ячейка не найдена", "Редактирование", 1); 
            }
        }
        catch(Exception $e)
        {
            $this->message($e->getMessage(), "Редактирование", 1);
        }
    }
    
}
?>